home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
-
- /*
- $Header: b1num.h,v 1.4 85/08/22 16:41:53 timo Exp $
- */
-
- /************************************************************************/
- /* Full numeric package: private definitions */
- /* */
- /* A number is modelled as one of zero, unbounded integer, */
- /* unbounded rational or approximate. */
- /* Zero has a 'length' field of zero, and nothing else. */
- /* A length field of +n means the number is an n digit integer, */
- /* (with digits to some large base). */
- /* A length of -1 means there follow two floating point numbers, */
- /* one the fraction (zero or .5 <= frac <= 1), one the exponent */
- /* with respect to base 2 (should be an integral value). */
- /* (This is so when EXT_RANGE is defined. Otherwise, there is */
- /* only one field, frac, which is not normalized. This saves */
- /* code and data space on e.g. the IBM PC, where the natural */
- /* range of double's is sufficient (~1E307).) */
- /* A length of -2 means there follow two values, pointers to two */
- /* unbounded integers, ie a rational number. */
- /* A length of -n, n>2, means it is a rational with a print width */
- /* of n-2. */
- /* */
- /************************************************************************/
-
- /*************** Definitions exported for integers *****************/
-
- typedef int digit;
-
- typedef struct integer {
- HEADER;
- digit dig[1];
- } *integer;
-
- #define FreezeSmallInt(v, vv) \
- (IsSmallInt(v) && (Freeze1(v, vv), Freeze2(v, vv)))
- #define Freeze1(v, vv) ((vv).type= Num, (vv).refcnt= Maxrefcnt)
- #define Freeze2(v, vv) \
- ((vv).len= (v) != 0, (vv).dig[0]= SmallIntVal(v), (v)= &(vv))
-
- integer int_gadd();
- integer int_canon();
- integer int_prod();
- integer int_quot();
- integer int_gcd();
- integer mk_int();
- integer int1mul();
- integer int_tento();
- integer int_half();
- integer int_mod();
- digit int_ldiv();
-
- #define int_0 ((integer) MkSmallInt(0))
- #define int_1 ((integer) MkSmallInt(1))
- #define int_2 ((integer) MkSmallInt(2))
- #define int_10 ((integer) MkSmallInt(10))
-
- #define int_sum(v, w) int_gadd(v, w, 1)
- #define int_diff(v, w) int_gadd(v, w, -1)
- #define int_neg(v) int_gadd(int_0, v, -1)
-
- #define Integral(v) (IsSmallInt(v) || Length(v)>=0)
- #define Modulo(a,b) (((a)%(b)+(b))%(b))
- #define Digit(v,n) ((v)->dig[n])
- #define Msd(v) (IsSmallInt(v) ? SmallIntVal(v) : Digit(v,Length(v)-1))
- #define Lsd(v) (IsSmallInt(v) ? SmallIntVal(v) : Digit(v,0))
-
- #define Odd(x) ((x)&1)
- #define Even(x) (!Odd(x))
-
- /* Provisional definitions */
-
- value copy();
- #define Copy(x) copy((value)(x))
-
- /***************** Definitions exported for rationals *****************/
-
- typedef struct {
- HEADER;
- integer num, den;
- } *rational;
-
-
- #define Numerator(a) ((a)->num)
- #define Denominator(a) ((a)->den)
- #define Rational(a) (!IsSmallInt(a) && Length(a)<-1)
- #define Roundsize(a) (-2-Length(a))
-
- rational mk_rat();
- rational rat_sum();
- rational rat_diff();
- rational rat_neg();
- rational rat_prod();
- rational rat_quot();
- rational rat_power();
-
- extern rational rat_zero;
- extern rational rat_half;
-
- value tento();
- value mk_exact();
-
- /***************** Definitions exported for approximate numbers *************/
-
- #ifdef vax
- #define EXT_RANGE
- #endif
-
- typedef struct real {
- HEADER;
- double frac;
- #ifdef EXT_RANGE
- double expo;
- #endif EXT_RANGE
- } *real;
-
- #define Frac(v) ((v)->frac)
- #ifdef EXT_RANGE
- #define Expo(v) ((v)->expo)
- #else
- #define Expo(v) 0.0
- #endif
-
- #define Approximate(v) (!IsSmallInt(v) && Length(v)==-1)
- #define Exact(v) (!Approximate(v))
-
- extern real app_0;
-
- real mk_approx();
-
- real app_sum();
- real app_diff();
- real app_prod();
- real app_quot();
- real app_neg();
-
- real app_exp();
- real app_log();
- real app_power();
-
- value app_floor();
-
-
- /* Numeric constants. */
- /* (Source: Knuth, The Art of Computer Programming, Vol. 1, Appendix B-1.) */
-
- #define logtwo 0.6931471805599453094172321214581765680755
- #define invlogtwo 1.4426950408889634073599246810018921374266
- #define logten 2.3025850929940456840179914546843642076011
- #define logBASE (logten*tenlogBASE)
- #define twologBASE (logBASE*invlogtwo)
-